import { DataTypes, Model, Sequelize } from "sequelize";

// content 存的是 树形数据

// [
//   {
//     "type": "paragraph",
//     "content": [
//       { "type": "text", "text": "你好，", "styles": {} },
//       { "type": "text", "text": "世界", "styles": { "bold": true } }
//     ]
//   },
//   {
//     "type": "blockAI",
//     "props": { "id": "ai-block-123", "title": "AI助手", "description": "演示", "content": "这里是AI生成内容" }
//   }
// ]
// Yjs文档持久化模型接口 表中 yjs_state 存的是二进制 原始数据

// 推荐：协同以 yjs_state 为“权威”，content 作为“可读快照 / 缓存”（便于预览与检索）。


// 1. documents 表的 content 字段
// 用途： 文档的 BlockNote JSON 格式快照
// 格式： [{"type":"paragraph","content":[{"type":"text","text":"..."}]}]
// 场景：
// 非协同编辑模式的文档保存
// 文档导出
// 备份和版本控制
// 搜索和索引
// 2. yjs_documents 表的 yjs_state 字段
// 用途： Yjs 文档的二进制状态数据
// 格式： LONGBLOB（Yjs 的二进制格式）
// 场景：
// 协同编辑的持久化
// 用户重新连接时的状态恢复
// 实时协同同步的基础
/**
 * 文档模型接口
 */
export interface DocumentAttributes {
  id?: string;
  title: string;
  content?: string; // 序列化的BlockNote内容
  yjs_state?: Buffer; // Yjs文档状态
  owner_id: string;
  status?: number; // 1-正常，0-删除，2-草稿
  is_public?: boolean;
  created_at?: Date;
  updated_at?: Date;
  last_sync_at?: Date; // 最后同步时间
}

/**
 * 文档模型类
 */
export class Document extends Model<DocumentAttributes> implements DocumentAttributes {
  public id!: string;
  public title!: string;
  public content!: string;
  public yjs_state!: Buffer;
  public owner_id!: string;
  public status!: number;
  public is_public!: boolean;
  public created_at!: Date;
  public updated_at!: Date;
  public last_sync_at!: Date;

  // 关联属性
  public readonly owner?: any;
  public readonly collaborations?: any[];
}

/**
 * 初始化文档模型
 */
export function initDocumentModel(sequelize: Sequelize): typeof Document {
  Document.init(
    {
      id: {
        type: DataTypes.UUID,
        primaryKey: true,
        defaultValue: DataTypes.UUIDV4,
        comment: "文档ID，UUID格式"
      },
      title: {
        type: DataTypes.STRING(255),
        allowNull: false,
        comment: "文档标题"
      },
      content: {
        type: DataTypes.TEXT("long" as any),
        allowNull: true,
        comment: "文档内容，JSON格式存储BlockNote内容"
      },
      yjs_state: {
        type: DataTypes.BLOB("long" as any),
        allowNull: true,
        comment: "Yjs文档状态，二进制格式"
      },
      owner_id: {
        type: DataTypes.BIGINT,
        allowNull: false,
        comment: "文档拥有者ID，关联users表"
      },
      status: {
        type: DataTypes.TINYINT,
        defaultValue: 1,
        comment: "文档状态：1-正常，0-删除，2-草稿"
      },
      is_public: {
        type: DataTypes.BOOLEAN,
        defaultValue: false,
        comment: "是否公开文档"
      },
      created_at: {
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
        comment: "创建时间"
      },
      updated_at: {
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
        comment: "更新时间"
      },
      last_sync_at: {
        type: DataTypes.DATE,
        allowNull: true,
        comment: "最后同步时间"
      }
    },
    {
      sequelize,
      tableName: "documents",
      modelName: "Document",
      timestamps: true,
      underscored: true,
      indexes: [
        {
          fields: ["owner_id"],
          name: "idx_owner_id"
        },
        {
          fields: ["status"],
          name: "idx_status"
        },
        {
          fields: ["created_at"],
          name: "idx_created_at"
        },
        {
          fields: ["is_public"],
          name: "idx_is_public"
        }
      ],
      comment: "文档基础信息表"
    }
  );

  return Document;
}

/**
 * 定义Document模型关联关系
 */
export function defineDocumentAssociations() {
  const { User } = require("./index");
  const { DocumentCollaboration } = require("./DocumentCollaboration");

  // Document属于User（文档拥有者）
  Document.belongsTo(User, {
    foreignKey: "owner_id",
    as: "owner"
  });

  // Document有多个DocumentCollaboration（协作关系）
  Document.hasMany(DocumentCollaboration, {
    foreignKey: "document_id",
    as: "collaborations"
  });
}
